// 观察者模式

package observer

import "fmt"

// 定义一个产品，内部存在一个观察者列表
type Product struct {
	Name         string
	observerList []Observer
}

// 定义观察者接口
type Observer interface {
	Update(product *Product)
}

func (p *Product) AddObserver(observer Observer) {
	p.observerList = append(p.observerList, observer)
}

func (p *Product) SetName(name string) {
	p.Name = name
	// 名字变化后，通知所有观察者
	for _, observer := range p.observerList {
		observer.Update(p)
	}
}

// 定义一个观察者A
type ObserverA struct {
	Observer
}

// 实现更新方法
func (o *ObserverA) Update(product *Product) {
	fmt.Printf("ObserverA: %s\n", product.Name)
}

// 定义一个观察者B
type ObserverB struct {
	Observer
}

func (o *ObserverB) Update(product *Product) {
	fmt.Printf("ObserverB: %s\n", product.Name)
}

func main() {
	// 创建一个产品
	product := &Product{}
	// 创建观察者A
	observerA := &ObserverA{}
	// 创建观察者B
	observerB := &ObserverB{}
	// 将观察者A添加到产品中
	product.AddObserver(observerA)
	// 将观察者B添加到产品中
	product.AddObserver(observerB)
	// 修改产品名字
	product.SetName("productA")
	// 修改产品名字
	product.SetName("productB")
}
